package com.example.im.core.singleton;

import com.example.im.core.vo.UserInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 用户缓存单例管理类
 *
 */
public class UserInfoManager {

	private final Logger LOG = LoggerFactory.getLogger(UserInfoManager.class);
	
    
    //所有用户信息（包括客户和客服）
    private static Map<String, UserInfo> userInfoMap = new ConcurrentHashMap<>();
    
    
	/** 
	*  饿汉式单例模式，类加载器加载时就有了本类的一个实例,提高了系统效率
	*/  
	private static UserInfoManager instance = new UserInfoManager();  
    
	/**
	 * 私有的构造函数，防止被任意调用，保证本类在整个项目中只能有一个实例
	 */
    private UserInfoManager() {
    }
    
    /**
     * 这里提供了一个供外部调用本 class的静态方法,可以直接访问
     * @return
     */
    public static UserInfoManager getInstance() {
    	initUserInfo();
    	return instance;
    }
    
    /**
     *  新增或者修改UserInfo
     * @param key
     * @param value
     * @return
     */
    public boolean addOrUpdateUserInfo(String key, UserInfo value) {
        boolean flag = false;
        try {
        	userInfoMap.put(key, value);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
            LOG.error("本地缓存新增或者修改用户出错，异常信息：{}，堆栈信息：{}",e.getMessage(),e);
            return false;
        }
        return flag;
    }
    
    /**
     * 获取UserInfo
     * @param key
     * @return
     */
    public UserInfo getUserInfo(String key) {
    	UserInfo UserInfo = userInfoMap.get(key);
        if (UserInfo != null) {
            return UserInfo;
        } else {
            return null;
        }
    }
    
    /**
     * 删除UserInfo
     * @param key
     * @return
     */
    public boolean removeUserInfo(String key) {
        boolean flag = false;
        try {
        	userInfoMap.remove(key);
            flag = true;
        } catch (Exception e) {
        	LOG.error("本地缓存刪除用户出错，异常信息：{}，堆栈信息：{}",e.getMessage(),e);
            return false;
        }
        return flag;
    }
    
    /**
     * 获取所有总用户数量
     * @return
     */
    public int getAllUserSize() {
        return userInfoMap.size();
    }
    
    
    public Map<String, UserInfo> listAllUserInfo() {
    	return userInfoMap;
    }
    
    /**
     *  初始化用户信息
     */
    private static void initUserInfo() {
    	UserInfo u1 = new UserInfo();
    	UserInfo u2 = new UserInfo();
    	UserInfo k1 = new UserInfo();
    	UserInfo k2 = new UserInfo();
    	
    	u1.setId("u1");
    	u1.setName("用户1");

    	u2.setId("u2");
    	u2.setName("用户2");

    	k1.setId("k1");
    	k1.setName("客服1");

    	k2.setId("k2");
    	k2.setName("客服2");

    	userInfoMap.put("u1", u1);
    	userInfoMap.put("u2", u2);
    	userInfoMap.put("k1", k1);
    	userInfoMap.put("k2", k2);
    }
    
    
}
